// #include <stdio.h>
// #include <stdlib.h>
// #include <time.h>
//
// #include "windows.h"
//
// //节点结构
// typedef struct LinkNode {
//     int data;
//     struct LinkNode* next;
// }LinkNode;
//
// //链表结构
// typedef struct LinkList {
//     LinkNode* head;
// }LinkList;
//
// //链表初始化
// LinkList* LinkInit() {
//     LinkList* list=(LinkList*)malloc(sizeof(LinkList));
//     if(list==NULL) {
//         exit(1);
//     }
//     list->head=(LinkNode*)malloc(sizeof(LinkNode));
//     list->head->next=NULL;
//     return list;
// }
//
// // 插入节点到链表尾部
// void LinkInsert(LinkList* list,int data) {
//     LinkNode* newNode=(LinkNode*)malloc(sizeof(LinkNode));
//     if(newNode==NULL) {
//         perror("malloc");
//     }
//     newNode->data=data;
//     newNode->next=NULL;
//     LinkNode* current=list->head;
//     while (current->next!=NULL) {
//         current=current->next;
//     }
//     current->next=newNode;
// }
// //头插法
// void LinkHeadInsert(LinkList* list,int data) {
//     LinkNode* newNode=malloc(sizeof(LinkNode));
//     if(newNode==NULL) {
//         perror("malloc");
//     }
//     newNode->data=data;
//     newNode->next=list->head->next;
//     list->head->next=newNode;
// }
//
// //打印链表
// void printLinkList(LinkList* list) {
//     LinkNode* current=list->head->next;
//     while(current!=NULL) {
//         printf("%d ",current->data);
//         current=current->next;
//     }
//     printf("\n");
// }
//
// // 释放链表内存
// void FreeLinkList(LinkList* list) {
//     if (list == NULL) {
//         return;
//     }
//     LinkNode* current = list->head;
//     while (current != NULL) {
//         LinkNode* next = current->next;
//         free(current);
//         current = next;
//     }
//     free(list);
// }
//
// //链表长度
// int LinkLength(LinkList* L) {
//     if(L==NULL) {
//         exit(1);
//     }
//     int length=0;
//     LinkNode* p=L->head->next;
//     while (p!=NULL) {
//         length++;
//         p=p->next;
//     }
//     return length;
// }
//
// // 真正的公共节点需要 L2 的某个 next 指针直接指向 L1 的某个节点
// // 找到两个链表的第一个公共节点
// LinkNode* findFirstCommonNode(LinkList* L1, LinkList* L2) {
//     if (L1 == NULL || L2 == NULL) {
//         return NULL;
//     }
//
//     int len1 = LinkLength(L1);
//     int len2 = LinkLength(L2);
//     int diff = abs(len1 - len2);
//
//     LinkNode* p1 = L1->head->next;
//     LinkNode* p2 = L2->head->next;
//
//     // 让较长的链表的指针先移动diff步
//     if (len1 > len2) {
//         for (int i = 0; i < diff; i++) {
//             p1 = p1->next;
//         }
//     } else {
//         for (int i = 0; i < diff; i++) {
//             p2 = p2->next;
//         }
//     }
//
//     // 同步遍历两个链表，寻找公共节点
//     while (p1 != NULL && p2 != NULL) {
//         if (p1 == p2) {
//             return p1;
//         }
//         p1 = p1->next;
//         p2 = p2->next;
//     }
//
//     return NULL;
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     // 创建两个链表
//     LinkList* L1 = LinkInit();
//     LinkList* L2 = LinkInit();
//
//     // 构建链表L1: 1 -> 2 -> 3 -> 4 -> 5
//     LinkInsert(L1, 1);
//     LinkInsert(L1, 2);
//     LinkInsert(L1, 3);
//     LinkInsert(L1, 4);
//     LinkInsert(L1, 5);
//
//     // 构建链表L2: 6 -> 7 -> 3 -> 4 -> 5（与L1共享节点3、4、5）
//     LinkInsert(L2, 6);
//     LinkInsert(L2, 7);
//     // 手动设置公共节点
//     LinkNode* commonNode = L1->head->next->next->next; // 指向L1的节点3
//     LinkNode* tail = L2->head;
//     while (tail->next != NULL) {
//         tail = tail->next;
//     }
//     tail->next = commonNode; // 将L2的尾节点指向L1的节点3
//
//     // 打印链表L1和L2
//     printf("链表L1: ");
//     printLinkList(L1);
//     printf("链表L2: ");
//     printLinkList(L2);
//
//     // 查找公共节点
//     LinkNode* common = findFirstCommonNode(L1, L2);
//     if (common != NULL) {
//         printf("第一个公共节点的值为: %d\n", common->data);
//     } else {
//         printf("没有公共节点\n");
//     }
//
//     // 释放链表内存（注意：由于有公共节点，释放时需要避免重复释放）
//     // 这里简单释放L1和L2的头节点，实际应用中需要更复杂的处理
//     FreeLinkList(L1);
//     // 由于L2的尾部指向L1的节点，直接释放L2会导致重复释放，这里仅释放L2的头节点
//     free(L2->head);
//     free(L2);
//
//     return 0;
// }